package br.ufrpe.paradigmas.poker;
import java.util.Arrays;


public class Jogo {
	
	private String [] mao;
	private short [] aux = new short [5];
	private short [] contCartas = new short [5];
	private short valorJogo=0;
	private short contDupla =0;
	
	public Jogo (String[] mao){
		setMao(trocaValor(mao));
		aux = valorCartas(mao);
		contCartas = contaCartas(mao);
		setValorJogo(avalia(mao));
	}
	
	
	public String[] getMao() {
		return mao;
	}

	public void setMao(String[] mao) {
		this.mao = mao;
	}

	public short getValorJogo() {
		return valorJogo;
	}

	public void setValorJogo(short valorJogo) {
		this.valorJogo = valorJogo;
	}

	public short[] getAux() {
		return aux;
	}

	public void setAux(short[] aux) {
		this.aux = aux;
	}

	public short[] getContCartas() {
		return contCartas;
	}

	public void setContCartas(short[] contCartas) {
		this.contCartas = contCartas;
	}

	public String [] trocaValor(String [] mao){ // Trocando os valores A,T,J,Q,K pelos valores reais das cartas
		for(short i=0;i<mao.length;i++){
		if(mao[i].charAt(0)=='A'){
			mao[i]=mao[i].replace(mao[i].charAt(0)+"", "14");
		}else if(mao[i].charAt(0)=='T'){
			mao[i]=mao[i].replace(mao[i].charAt(0)+"", "10");
		}else if(mao[i].charAt(0)=='J'){
			mao[i]=mao[i].replace(mao[i].charAt(0)+"", "11");
		}else if(mao[i].charAt(0)=='Q'){
			mao[i]=mao[i].replace(mao[i].charAt(0)+"", "12");
		}else if(mao[i].charAt(0)=='K'){
			mao[i]=mao[i].replace(mao[i].charAt(0)+"", "13");
		}
		
		}
		return mao;
	}
	
	public short [] valorCartas(String [] mao){
		short [] valores = new short [5];		
		for(short i=0;i<mao.length;i++){//Passando os valores das cartas para inteiro
			if(mao[i].length()==3){
				valores[i] = (short) Integer.parseInt(mao[i].charAt(0)+""+mao[i].charAt(1) );			
			}else if(mao[i].length()==2){
				valores[i] = (short) Integer.parseInt(mao[i].charAt(0)+"");
			}			
		}
		Arrays.sort(valores);
		return valores;
	}
	
	public short [] contaCartas(String [] mao){
		short [] contadores= {0,0,0,0,0};
		for(short i=0; i<valorCartas(mao).length;i++){
			for(short j=0; j<valorCartas(mao).length;j++){
				if(valorCartas(mao)[i]==valorCartas(mao)[j]){
					contadores[i]++;
					}
			}
		}
		return contadores;
	}		
	
	
	
	public short avalia(String[] mao){
		short valor=0;
		
		if(umPar(mao)){
			valor=2;
		}else if(doisPares(mao)){
			valor=3;
		}else if(trinca(mao)){
			valor=4;
		}else if(sequencia(mao)){
			valor=5;
		}else if(flush(mao)){
			valor=6;
		}else if(fullHouse(mao)){
			valor=7;
		}else if(quadra(mao)){
			valor=8;
		}else if(straightFlush(mao)){
			valor=9;
		}else if(royalFlush(mao)){
			valor=10;
		}else {
			valor=1;
		}
			
		return valor;
		
	}
	
public boolean ehDupla(String[] mao){
		
	for(short i=0;i<mao.length;i++){
		if(contCartas[i]==2){
			contDupla++;
		}
	}
	if(contDupla==2  || contDupla==4){
		return true;
	}else{
		return false;
	}
	
}
	
	public boolean ehTrio(String[] mao){
		
		if((contCartas[0]==3 || contCartas[1]==3 || contCartas[2]==3 || contCartas[3]==3 || contCartas[4]==3) && 
				(contCartas[0]!=2 || contCartas[1]!=2 || contCartas[2]!=2 || contCartas[3]!=2 || contCartas[4]!=2 )){
			return true;
		}else{
			return false;			
		}
	}
	
	public boolean ehQuadra(String[] mao){
		
		if(contCartas[0]==4 || contCartas[1]==4 || contCartas[2]==4 || contCartas[3]==4 || contCartas[4]==4){
			return true;
		}else{
			return false;			
		}
		
	}
	
	public boolean ehSequencia(String[] mao){
		
		if(aux[4]-aux[3]==1 && aux[3]-aux[2]==1 && aux[2]-aux[1]==1 && aux[1]-aux[0]==1){
			return true;
		}else{
			return false;
		}
	}
	
	private boolean umPar(String[] mao) {
				
		if(ehDupla(mao) && contDupla==2){
			return true;
		}else{
			return false;
		}
		
	}

	private boolean doisPares(String[] mao) {
		if(ehDupla(mao) && contDupla==4){
			return true;
		}else{
			return false;
		}
	
	}

	private boolean trinca(String[] mao) {
		if(ehTrio(mao)){
			return true;
		}else{
			return false;			
		}
	}

	private boolean sequencia(String[] mao) {
		if(ehSequencia(mao)){
			return true;
		}else{
			return false;
		}
	}

	private boolean flush(String[] mao) {
		if(mao[0].charAt(1)==mao[1].charAt(1) && mao[1].charAt(1)==mao[2].charAt(1) && mao[2].charAt(1)==mao[3].charAt(1) && mao[3].charAt(1)==mao[4].charAt(1)){
			return true;
		}else{
			return false;
		}
	
	}

	private boolean fullHouse(String[] mao) {

		if(ehTrio(mao) && ehDupla(mao) && contDupla==2){
			return true;
		}else{
			return false;			
		}
	}

	private boolean quadra(String[] mao) {
		
		if(ehQuadra(mao)){
			return true;
		}else{
			return false;			
		}
		
	}

	private boolean straightFlush(String[] mao) {
		
		if(flush(mao) && sequencia(mao)){
			return true;
		}
		else{
			return false;
		}
	}

	private boolean royalFlush(String[] mao) {
		
		if(flush(mao) && aux[0] == 10){
			return true;
		}
		else{
			return false;
		}
		
	}

	
}